/**
 * Copyright (C) 2019-2021 杭州优诗科技有限公司
 *
 * This file is part of UnitSpirit.
 * @author wupingfu
 * @version 1.0.0
 * 
 **/
package com.unitspirit.sample.generics;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author wupf
 *
 */
public class Generic4 {
	private Map<String, Integer> score;

	private Map<?, ?> score2;

	private static List<?> score3;

	public Map<String, Integer> get2() {
		return score;
	}

	public int get3() {
		
		return 0;
	}

	public void get4() {
	}

	public static void main(String[] args) throws Exception {
		score3 = new ArrayList<String>();

		Class<Generic4> clazz = Generic4.class;
		Field f = clazz.getDeclaredField("score");
		// 直接使用getType()取出类型只对普通类型的成员变量有效
		Class<?> a = f.getType();
		// 下面将看到仅输出java.util.Map
		System.out.println("score 的类型是：" + a);
		// 获得成员变量f的泛型类型
		Type gType = f.getGenericType();
		// 如果 gType 类型是 ParameterizedType对象
		if (gType instanceof ParameterizedType) {
			// 强制类型转换
			ParameterizedType pType = (ParameterizedType) gType;
			// 获取原始类型
			Type rType = pType.getRawType();
			System.out.println("原始类型是：" + rType);
			// 取得泛型类型的泛型参数
			Type[] tArgs = pType.getActualTypeArguments();
			System.out.println("泛型信息是:");
			for (int i = 0; i < tArgs.length; i++) {
				System.out.println("第" + i + "个泛型类型是：" + tArgs[i]);
			}
		} else {

			System.out.println("获取泛型类型出错!");
		}

		get2(clazz);
		getMethodReturn(clazz);
	}



	public static void getMethodReturn(Class<Generic4> clazz) throws Exception {
		Method method = clazz.getDeclaredMethod("get4");
		// 直接使用getType()取出类型只对普通类型的成员变量有效
		// 获得成员变量f的泛型类型
		Type gType = method.getGenericReturnType();
		// 如果 gType 类型是 ParameterizedType对象
		if (gType instanceof ParameterizedType) {
			// 强制类型转换
			ParameterizedType pType = (ParameterizedType) gType;
			// 获取原始类型
			Type rType = pType.getRawType();
			System.out.println("原始类型是：" + rType.getTypeName());
			// 取得泛型类型的泛型参数
			Type[] tArgs = pType.getActualTypeArguments();
			System.out.println("泛型信息是:");
			for (int i = 0; i < tArgs.length; i++) {
				System.out.println("第" + i + "个泛型类型是：" + tArgs[i].getTypeName());
			}
		} else {
			System.out.println(gType.getTypeName());

		}
	}

	public static void get2(Class<Generic4> clazz) throws Exception {
		Field f = clazz.getDeclaredField("score3");
		// 直接使用getType()取出类型只对普通类型的成员变量有效
		Class<?> a = f.getType();
		// 下面将看到仅输出java.util.Map
		System.out.println("score 的类型是：" + a);
		// 获得成员变量f的泛型类型
		Type gType = f.getGenericType();
		// 如果 gType 类型是 ParameterizedType对象
		if (gType instanceof ParameterizedType) {
			// 强制类型转换
			ParameterizedType pType = (ParameterizedType) gType;
			// 获取原始类型
			Type rType = pType.getRawType();
			System.out.println("原始类型是：" + rType);
			// 取得泛型类型的泛型参数
			Type[] tArgs = pType.getActualTypeArguments();
			System.out.println("泛型信息是:");
			for (int i = 0; i < tArgs.length; i++) {
				System.out.println("第" + i + "个泛型类型是：" + tArgs[i]);
			}
		} else {
			System.out.println("获取泛型类型出错!");
		}
	}
}
